# -*- coding=UTF-8 -*-
import openpyxl
import os
import sys
from conf.constant import cons
from common.mylog import log


class CaseData(object):
    """测试数据类"""
    def __init__(self,zip_obj):
        # 遍历打包好的测试数据对象
        for i in zip_obj:
            # 将每一个表格数据的表头作为属性，值作为属性值
            setattr(self,i[0],i[1])


class excel_operation(object):
    def __init__(self,excel_name,sheet_name,cp_excel_name=None,cp_sheet_name=None):
        # 初始化excel相关属性
        self.excel_name = excel_name
        self.sheet_name = sheet_name
        self.cp_excel_name = cp_excel_name
        self.cp_sheet_name = cp_sheet_name


    def open_excel(self):
        # 获取用例文件
        self.data_path = os.path.join(cons.DATA_PATH, self.excel_name)
        # 打开原excel文件，返回一个工作簿对象
        self.wb = openpyxl.load_workbook(self.data_path)
        # 通过工作簿对象，选择表单
        self.sh = self.wb[self.sheet_name]

    def open_CpExcel(self):
        # 获取用例文件
        self.resultxlsx = os.path.join(cons.XLSX_REPORT_PATH, self.cp_excel_name)
        # 打开复制的excel文件，返回一个工作簿对象
        self.wb = openpyxl.load_workbook(self.resultxlsx)
        # 通过工作簿对象，选择表单
        self.sh = self.wb[self.cp_sheet_name]


    # 读取excel文件测试用例
    def read_excel(self):
        """
        第一版：简单
        读取excel表单中的数据，存放在list列表中
        获取数据形式：data["title"]
        """

        # 调用open_excel()方法，打开excel文件和选择表单
        self.open_excel()

        # 获取总行数、总列数
        nrows = self.sh.max_row

        # 按行获取所有表格对象，每一行的内容放在一个元组中，以列表形式返回
        rows = list(self.sh.rows)

        if nrows > 2:
            # 获取第二行的内容(即表头字段)作为key值，列表格式
            keys = [t.value for t in rows[1]]
            # print(keys)
            # 创建一个空列表，用于存放所有测试数据
            listApiData = []  # 获取每一行的内容（从第三行开始），列表格式
            # 遍历其他行的数据，和表头进行打包
            for row in rows[2:]:
                # 获取每行数据
                values = [i.value for i in row]
                # print(values)
                # keys，values这两个列表一一对应来组合转换为字典
                api_dict = dict(zip(keys, values))
                # print(api_dict)
                listApiData.append(api_dict)
                print(listApiData)
            return listApiData
        else:
            log.info("总行数小于2，表格未填写数据")
            return None

    def read_excel_obj(self):
        """
        第二版：高阶
        读取excel表单中的数据，以setattr方法设置成CaseData类的属性
        获取数据形式：data.title
        """

        # 调用open_excel()方法，打开excel文件和选择表单
        self.open_excel()

        # 获取总行数、总列数
        nrows = self.sh.max_row

        # 按行获取所有表格对象，每一行的内容放在一个元组中，以列表形式返回
        rows = list(self.sh.rows)

        if nrows > 2:
            # 获取第二行的内容(即表头字段)作为key值，列表格式
            keys = [t.value for t in rows[1]]
            # print(keys)
            # 创建一个空列表，用于存放所有测试数据
            cases = []  # 获取每一行的内容（从第三行开始），列表格式
            # 遍历其他行的数据，和表头进行打包
            for row in rows[2:]:
                # 获取每行数据
                values = [i.value for i in row]
                # print(values)
                # keys，values这两个列表一一对应来组合转换为字典
                zip_obj = zip(keys, values)
                # 通过CaseData类创建测试数据对象，将zip_obj作为参数
                case_data = CaseData(zip_obj)
                cases.append(case_data)
                # 将包含所有测试数据的列表cases返回
            return cases
        else:
            log.info("总行数小于2，表格未填写数据")
            return None


    def copy_excel(self):
        """将原excel中的测试用例数据复制到另一个表中"""

        # 调用open_excel()方法，打开excel文件和选择表单
        self.open_excel()
        # 将测试用例文件复制到result文件下
        resultxlsx = os.path.join(cons.XLSX_REPORT_PATH, self.cp_excel_name)
        '''复制Excel，把excel_name数据复制到cp_excel_name'''
        self.cp_wb = openpyxl.Workbook()
        self.cp_wb.save(resultxlsx)
        self.cp_wb = openpyxl.load_workbook(resultxlsx)
        self.cp_sh = self.cp_wb.create_sheet(self.cp_sheet_name)

        max_row = self.sh.max_row         # 最大行数
        max_column = self.sh.max_column   # 最大列数

        for m in list(range(1, max_row+1)):
            for n in list(range(97, 97+max_column)):   # chr(97)='a'
                n = chr(n)                            # ASCII字符
                i ='%s%d'% (n, m)                     # 单元格编号
                cell1 = self.sh[i].value               # 获取data单元格数据
                self.cp_sh[i].value = cell1               # 赋值到test单元格

        self.cp_wb.save(resultxlsx)                 # 保存数据
        self.wb.close()                          # 关闭excel
        self.cp_wb.close()

    def write_excel(self, row_n, col_n, value):
        """
        在原excel文件写入数据
        row:写入的行
        column:写放的列
        value:写入的内容
        """
        # 打开文件
        self.open_excel()
        '''写入数据，如(2,3，"hello"),第二行第三列写入数据"hello"'''
        self.sh.cell(row_n, col_n, value=value)
        self.wb.save(self.data_path)

    def write_cp_excel(self, row_n, col_n, value):
        """
        在复制的excel文件中写入数据
        row:写入的行
        column:写放的列
        value:写入的内容
        """
        # 打开文件
        self.open_CpExcel()
        '''写入数据，如(2,3，"hello"),第二行第三列写入数据"hello"'''
        self.sh.cell(row_n, col_n, value=value)
        self.wb.save(self.resultxlsx)




# a = excel_operation("heartretail.xlsx", "case","casecopy.xlsx","copy_case")
# # a.read_excel()
#
# a.copy_excel()
# wt = a.write_excel(11, 15, "HELLEOP")

